﻿/*
 Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
 For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
(function () {
    function u() {
        var c = this.getDialog(),
            p = c._.editor,
            n = p.config.linkPhoneRegExp,
            q = p.config.linkPhoneMsg,
            p = CKEDITOR.dialog.validate.notEmpty(p.lang.link.noTel).apply(this);
        if (!c.getContentElement('info', 'linkType') || 'tel' != c.getValueOf('info', 'linkType')) return !0;
        if (!0 !== p) return p;
        if (n) return CKEDITOR.dialog.validate.regex(n, q).call(this);
    }
    CKEDITOR.dialog.add('link', function (c) {
        function p(a, b) {
            var c = a.createRange();
            c.setStartBefore(b);
            c.setEndAfter(b);
            return c;
        }
        var n = CKEDITOR.plugins.link,
            q,
            t = function () {
                var a = this.getDialog(),
                    b = a.getContentElement('target', 'popupFeatures'),
                    a = a.getContentElement('target', 'linkTargetName'),
                    r = this.getValue();
                if (b && a)
                    switch (((b = b.getElement()), b.hide(), a.setValue(''), r)) {
                        case 'frame':
                            a.setLabel(c.lang.link.targetFrameName);
                            a.getElement().show();
                            break;
                        case 'popup':
                            b.show();
                            a.setLabel(c.lang.link.targetPopupName);
                            a.getElement().show();
                            break;
                        default:
                            a.setValue(r), a.getElement().hide();
                    }
            },
            d = function (a) {
                a.target && this.setValue(a.target[this.id] || '');
            },
            g = function (a) {
                a.advanced && this.setValue(a.advanced[this.id] || '');
            },
            e = function (a) {
                a.target || (a.target = {});
                a.target[this.id] = this.getValue() || '';
            },
            k = function (a) {
                a.advanced || (a.advanced = {});
                a.advanced[this.id] = this.getValue() || '';
            },
            h = c.lang.common,
            b = c.lang.link,
            l;
        return {
            title: b.title,
            minWidth: 'moono-lisa' == (CKEDITOR.skinName || c.config.skin) ? 450 : 350,
            minHeight: 240,
            getModel: function (a) {
                return n.getSelectedLink(a, !0)[0] || null;
            },
            contents: [
                {
                    id: 'info',
                    label: b.info,
                    title: b.info,
                    elements: [
                        {
                            type: 'text',
                            id: 'linkDisplayText',
                            label: b.displayText,
                            setup: function () {
                                this.enable();
                                this.setValue(c.getSelection().getSelectedText());
                                q = this.getValue();
                            },
                            commit: function (a) {
                                a.linkText = this.isEnabled() ? this.getValue() : '';
                            },
                        },
                        {
                            id: 'linkType',
                            type: 'select',
                            label: b.type,
                            default: 'url',
                            items: [
                                [b.toUrl, 'url'],
                                [b.toAnchor, 'anchor'],
                                [b.toEmail, 'email'],
                                [b.toPhone, 'tel'],
                            ],
                            onChange: function () {
                                var a = this.getDialog(),
                                    b = ['urlOptions', 'anchorOptions', 'emailOptions', 'telOptions'],
                                    r = this.getValue(),
                                    f = a.definition.getContents('upload'),
                                    f = f && f.hidden;
                                'url' == r
                                    ? (c.config.linkShowTargetTab && a.showPage('target'), f || a.showPage('upload'))
                                    : (a.hidePage('target'), f || a.hidePage('upload'));
                                for (f = 0; f < b.length; f++) {
                                    var m = a.getContentElement('info', b[f]);
                                    m &&
                                        ((m = m.getElement().getParent().getParent()),
                                        b[f] == r + 'Options' ? m.show() : m.hide());
                                }
                                a.layout();
                            },
                            setup: function (a) {
                                this.setValue(a.type || 'url');
                            },
                            commit: function (a) {
                                a.type = this.getValue();
                            },
                        },
                        {
                            type: 'vbox',
                            id: 'urlOptions',
                            children: [
                                {
                                    type: 'hbox',
                                    widths: ['25%', '75%'],
                                    children: [
                                        {
                                            id: 'protocol',
                                            type: 'select',
                                            label: h.protocol,
                                            items: [
                                                ['http://‎', 'http://'],
                                                ['https://‎', 'https://'],
                                                ['ftp://‎', 'ftp://'],
                                                ['news://‎', 'news://'],
                                                [b.other, ''],
                                            ],
                                            default: c.config.linkDefaultProtocol,
                                            setup: function (a) {
                                                a.url && this.setValue(a.url.protocol || '');
                                            },
                                            commit: function (a) {
                                                a.url || (a.url = {});
                                                a.url.protocol = this.getValue();
                                            },
                                        },
                                        {
                                            type: 'text',
                                            id: 'url',
                                            label: h.url,
                                            required: !0,
                                            onLoad: function () {
                                                this.allowOnChange = !0;
                                            },
                                            onKeyUp: function () {
                                                this.allowOnChange = !1;
                                                var a = this.getDialog().getContentElement('info', 'protocol'),
                                                    b = this.getValue(),
                                                    c = /^((javascript:)|[#\/\.\?])/i,
                                                    f = /^(http|https|ftp|news):\/\/(?=.)/i.exec(b);
                                                f
                                                    ? (this.setValue(b.substr(f[0].length)),
                                                      a.setValue(f[0].toLowerCase()))
                                                    : c.test(b) && a.setValue('');
                                                this.allowOnChange = !0;
                                            },
                                            onChange: function () {
                                                if (this.allowOnChange) this.onKeyUp();
                                            },
                                            validate: function () {
                                                var a = this.getDialog();
                                                return a.getContentElement('info', 'linkType') &&
                                                    'url' != a.getValueOf('info', 'linkType')
                                                    ? !0
                                                    : !c.config.linkJavaScriptLinksAllowed &&
                                                      /javascript\:/.test(this.getValue())
                                                    ? (alert(h.invalidValue), !1)
                                                    : this.getDialog().fakeObj
                                                    ? !0
                                                    : CKEDITOR.dialog.validate.notEmpty(b.noUrl).apply(this);
                                            },
                                            setup: function (a) {
                                                this.allowOnChange = !1;
                                                a.url && this.setValue(a.url.url);
                                                this.allowOnChange = !0;
                                            },
                                            commit: function (a) {
                                                this.onChange();
                                                a.url || (a.url = {});
                                                a.url.url = this.getValue();
                                                this.allowOnChange = !1;
                                            },
                                        },
                                    ],
                                    setup: function () {
                                        this.getDialog().getContentElement('info', 'linkType') ||
                                            this.getElement().show();
                                    },
                                },
                                {
                                    type: 'button',
                                    id: 'browse',
                                    hidden: 'true',
                                    filebrowser: 'info:url',
                                    label: h.browseServer,
                                },
                            ],
                        },
                        {
                            type: 'vbox',
                            id: 'anchorOptions',
                            width: 260,
                            align: 'center',
                            padding: 0,
                            children: [
                                {
                                    type: 'fieldset',
                                    id: 'selectAnchorText',
                                    label: b.selectAnchor,
                                    setup: function () {
                                        l = n.getEditorAnchors(c);
                                        this.getElement()[l && l.length ? 'show' : 'hide']();
                                    },
                                    children: [
                                        {
                                            type: 'hbox',
                                            id: 'selectAnchor',
                                            children: [
                                                {
                                                    type: 'select',
                                                    id: 'anchorName',
                                                    default: '',
                                                    label: b.anchorName,
                                                    style: 'width: 100%;',
                                                    items: [['']],
                                                    setup: function (a) {
                                                        this.clear();
                                                        this.add('');
                                                        if (l)
                                                            for (var b = 0; b < l.length; b++)
                                                                l[b].name && this.add(l[b].name);
                                                        a.anchor && this.setValue(a.anchor.name);
                                                        (a = this.getDialog().getContentElement('info', 'linkType')) &&
                                                            'email' == a.getValue() &&
                                                            this.focus();
                                                    },
                                                    commit: function (a) {
                                                        a.anchor || (a.anchor = {});
                                                        a.anchor.name = this.getValue();
                                                    },
                                                },
                                                {
                                                    type: 'select',
                                                    id: 'anchorId',
                                                    default: '',
                                                    label: b.anchorId,
                                                    style: 'width: 100%;',
                                                    items: [['']],
                                                    setup: function (a) {
                                                        this.clear();
                                                        this.add('');
                                                        if (l)
                                                            for (var b = 0; b < l.length; b++)
                                                                l[b].id && this.add(l[b].id);
                                                        a.anchor && this.setValue(a.anchor.id);
                                                    },
                                                    commit: function (a) {
                                                        a.anchor || (a.anchor = {});
                                                        a.anchor.id = this.getValue();
                                                    },
                                                },
                                            ],
                                            setup: function () {
                                                this.getElement()[l && l.length ? 'show' : 'hide']();
                                            },
                                        },
                                    ],
                                },
                                {
                                    type: 'html',
                                    id: 'noAnchors',
                                    style: 'text-align: center;',
                                    html:
                                        '\x3cdiv role\x3d"note" tabIndex\x3d"-1"\x3e' +
                                        CKEDITOR.tools.htmlEncode(b.noAnchors) +
                                        '\x3c/div\x3e',
                                    focus: !0,
                                    setup: function () {
                                        this.getElement()[l && l.length ? 'hide' : 'show']();
                                    },
                                },
                            ],
                            setup: function () {
                                this.getDialog().getContentElement('info', 'linkType') || this.getElement().hide();
                            },
                        },
                        {
                            type: 'vbox',
                            id: 'emailOptions',
                            padding: 1,
                            children: [
                                {
                                    type: 'text',
                                    id: 'emailAddress',
                                    label: b.emailAddress,
                                    required: !0,
                                    validate: function () {
                                        var a = this.getDialog();
                                        return a.getContentElement('info', 'linkType') &&
                                            'email' == a.getValueOf('info', 'linkType')
                                            ? CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this)
                                            : !0;
                                    },
                                    setup: function (a) {
                                        a.email && this.setValue(a.email.address);
                                        (a = this.getDialog().getContentElement('info', 'linkType')) &&
                                            'email' == a.getValue() &&
                                            this.select();
                                    },
                                    commit: function (a) {
                                        a.email || (a.email = {});
                                        a.email.address = this.getValue();
                                    },
                                },
                                {
                                    type: 'text',
                                    id: 'emailSubject',
                                    label: b.emailSubject,
                                    setup: function (a) {
                                        a.email && this.setValue(a.email.subject);
                                    },
                                    commit: function (a) {
                                        a.email || (a.email = {});
                                        a.email.subject = this.getValue();
                                    },
                                },
                                {
                                    type: 'textarea',
                                    id: 'emailBody',
                                    label: b.emailBody,
                                    rows: 3,
                                    default: '',
                                    setup: function (a) {
                                        a.email && this.setValue(a.email.body);
                                    },
                                    commit: function (a) {
                                        a.email || (a.email = {});
                                        a.email.body = this.getValue();
                                    },
                                },
                            ],
                            setup: function () {
                                this.getDialog().getContentElement('info', 'linkType') || this.getElement().hide();
                            },
                        },
                        {
                            type: 'vbox',
                            id: 'telOptions',
                            padding: 1,
                            children: [
                                {
                                    type: 'tel',
                                    id: 'telNumber',
                                    label: b.phoneNumber,
                                    required: !0,
                                    validate: u,
                                    setup: function (a) {
                                        a.tel && this.setValue(a.tel);
                                        (a = this.getDialog().getContentElement('info', 'linkType')) &&
                                            'tel' == a.getValue() &&
                                            this.select();
                                    },
                                    commit: function (a) {
                                        a.tel = this.getValue();
                                    },
                                },
                            ],
                            setup: function () {
                                this.getDialog().getContentElement('info', 'linkType') || this.getElement().hide();
                            },
                        },
                    ],
                },
                {
                    id: 'target',
                    requiredContent: 'a[target]',
                    label: b.target,
                    title: b.target,
                    elements: [
                        {
                            type: 'hbox',
                            widths: ['50%', '50%'],
                            children: [
                                {
                                    type: 'select',
                                    id: 'linkTargetType',
                                    label: h.target,
                                    default: 'notSet',
                                    style: 'width : 100%;',
                                    items: [
                                        [h.notSet, 'notSet'],
                                        [b.targetFrame, 'frame'],
                                        [b.targetPopup, 'popup'],
                                        [h.targetNew, '_blank'],
                                        [h.targetTop, '_top'],
                                        [h.targetSelf, '_self'],
                                        [h.targetParent, '_parent'],
                                    ],
                                    onChange: t,
                                    setup: function (a) {
                                        a.target && this.setValue(a.target.type || 'notSet');
                                        t.call(this);
                                    },
                                    commit: function (a) {
                                        a.target || (a.target = {});
                                        a.target.type = this.getValue();
                                    },
                                },
                                {
                                    type: 'text',
                                    id: 'linkTargetName',
                                    label: b.targetFrameName,
                                    default: '',
                                    setup: function (a) {
                                        a.target && this.setValue(a.target.name);
                                    },
                                    commit: function (a) {
                                        a.target || (a.target = {});
                                        a.target.name = this.getValue().replace(/([^\x00-\x7F]|\s)/gi, '');
                                    },
                                },
                            ],
                        },
                        {
                            type: 'vbox',
                            width: '100%',
                            align: 'center',
                            padding: 2,
                            id: 'popupFeatures',
                            children: [
                                {
                                    type: 'fieldset',
                                    label: b.popupFeatures,
                                    children: [
                                        {
                                            type: 'hbox',
                                            children: [
                                                {
                                                    type: 'checkbox',
                                                    id: 'resizable',
                                                    label: b.popupResizable,
                                                    setup: d,
                                                    commit: e,
                                                },
                                                {
                                                    type: 'checkbox',
                                                    id: 'status',
                                                    label: b.popupStatusBar,
                                                    setup: d,
                                                    commit: e,
                                                },
                                            ],
                                        },
                                        {
                                            type: 'hbox',
                                            children: [
                                                {
                                                    type: 'checkbox',
                                                    id: 'location',
                                                    label: b.popupLocationBar,
                                                    setup: d,
                                                    commit: e,
                                                },
                                                {
                                                    type: 'checkbox',
                                                    id: 'toolbar',
                                                    label: b.popupToolbar,
                                                    setup: d,
                                                    commit: e,
                                                },
                                            ],
                                        },
                                        {
                                            type: 'hbox',
                                            children: [
                                                {
                                                    type: 'checkbox',
                                                    id: 'menubar',
                                                    label: b.popupMenuBar,
                                                    setup: d,
                                                    commit: e,
                                                },
                                                {
                                                    type: 'checkbox',
                                                    id: 'fullscreen',
                                                    label: b.popupFullScreen,
                                                    setup: d,
                                                    commit: e,
                                                },
                                            ],
                                        },
                                        {
                                            type: 'hbox',
                                            children: [
                                                {
                                                    type: 'checkbox',
                                                    id: 'scrollbars',
                                                    label: b.popupScrollBars,
                                                    setup: d,
                                                    commit: e,
                                                },
                                                {
                                                    type: 'checkbox',
                                                    id: 'dependent',
                                                    label: b.popupDependent,
                                                    setup: d,
                                                    commit: e,
                                                },
                                            ],
                                        },
                                        {
                                            type: 'hbox',
                                            children: [
                                                {
                                                    type: 'text',
                                                    widths: ['50%', '50%'],
                                                    labelLayout: 'horizontal',
                                                    label: h.width,
                                                    id: 'width',
                                                    setup: d,
                                                    commit: e,
                                                },
                                                {
                                                    type: 'text',
                                                    labelLayout: 'horizontal',
                                                    widths: ['50%', '50%'],
                                                    label: b.popupLeft,
                                                    id: 'left',
                                                    setup: d,
                                                    commit: e,
                                                },
                                            ],
                                        },
                                        {
                                            type: 'hbox',
                                            children: [
                                                {
                                                    type: 'text',
                                                    labelLayout: 'horizontal',
                                                    widths: ['50%', '50%'],
                                                    label: h.height,
                                                    id: 'height',
                                                    setup: d,
                                                    commit: e,
                                                },
                                                {
                                                    type: 'text',
                                                    labelLayout: 'horizontal',
                                                    label: b.popupTop,
                                                    widths: ['50%', '50%'],
                                                    id: 'top',
                                                    setup: d,
                                                    commit: e,
                                                },
                                            ],
                                        },
                                    ],
                                },
                            ],
                        },
                    ],
                },
                {
                    id: 'upload',
                    label: b.upload,
                    title: b.upload,
                    hidden: !0,
                    filebrowser: 'uploadButton',
                    elements: [
                        { type: 'file', id: 'upload', label: h.upload, style: 'height:40px', size: 29 },
                        {
                            type: 'fileButton',
                            id: 'uploadButton',
                            label: h.uploadSubmit,
                            filebrowser: 'info:url',
                            for: ['upload', 'upload'],
                        },
                    ],
                },
                {
                    id: 'advanced',
                    label: b.advanced,
                    title: b.advanced,
                    elements: [
                        {
                            type: 'vbox',
                            padding: 1,
                            children: [
                                {
                                    type: 'hbox',
                                    widths: ['45%', '35%', '20%'],
                                    children: [
                                        {
                                            type: 'text',
                                            id: 'advId',
                                            requiredContent: 'a[id]',
                                            label: b.id,
                                            setup: g,
                                            commit: k,
                                        },
                                        {
                                            type: 'select',
                                            id: 'advLangDir',
                                            requiredContent: 'a[dir]',
                                            label: b.langDir,
                                            default: '',
                                            style: 'width:110px',
                                            items: [
                                                [h.notSet, ''],
                                                [b.langDirLTR, 'ltr'],
                                                [b.langDirRTL, 'rtl'],
                                            ],
                                            setup: g,
                                            commit: k,
                                        },
                                        {
                                            type: 'text',
                                            id: 'advAccessKey',
                                            requiredContent: 'a[accesskey]',
                                            width: '80px',
                                            label: b.acccessKey,
                                            maxLength: 1,
                                            setup: g,
                                            commit: k,
                                        },
                                    ],
                                },
                                {
                                    type: 'hbox',
                                    widths: ['45%', '35%', '20%'],
                                    children: [
                                        {
                                            type: 'text',
                                            label: b.name,
                                            id: 'advName',
                                            requiredContent: 'a[name]',
                                            setup: g,
                                            commit: k,
                                        },
                                        {
                                            type: 'text',
                                            label: b.langCode,
                                            id: 'advLangCode',
                                            requiredContent: 'a[lang]',
                                            width: '110px',
                                            default: '',
                                            setup: g,
                                            commit: k,
                                        },
                                        {
                                            type: 'text',
                                            label: b.tabIndex,
                                            id: 'advTabIndex',
                                            requiredContent: 'a[tabindex]',
                                            width: '80px',
                                            maxLength: 5,
                                            setup: g,
                                            commit: k,
                                        },
                                    ],
                                },
                            ],
                        },
                        {
                            type: 'vbox',
                            padding: 1,
                            children: [
                                {
                                    type: 'hbox',
                                    widths: ['45%', '55%'],
                                    children: [
                                        {
                                            type: 'text',
                                            label: b.advisoryTitle,
                                            requiredContent: 'a[title]',
                                            default: '',
                                            id: 'advTitle',
                                            setup: g,
                                            commit: k,
                                        },
                                        {
                                            type: 'text',
                                            label: b.advisoryContentType,
                                            requiredContent: 'a[type]',
                                            default: '',
                                            id: 'advContentType',
                                            setup: g,
                                            commit: k,
                                        },
                                    ],
                                },
                                {
                                    type: 'hbox',
                                    widths: ['45%', '55%'],
                                    children: [
                                        {
                                            type: 'text',
                                            label: b.cssClasses,
                                            requiredContent: 'a(cke-xyz)',
                                            default: '',
                                            id: 'advCSSClasses',
                                            setup: g,
                                            commit: k,
                                        },
                                        {
                                            type: 'text',
                                            label: b.charset,
                                            requiredContent: 'a[charset]',
                                            default: '',
                                            id: 'advCharset',
                                            setup: g,
                                            commit: k,
                                        },
                                    ],
                                },
                                {
                                    type: 'hbox',
                                    widths: ['45%', '55%'],
                                    children: [
                                        {
                                            type: 'text',
                                            label: b.rel,
                                            requiredContent: 'a[rel]',
                                            default: '',
                                            id: 'advRel',
                                            setup: g,
                                            commit: k,
                                        },
                                        {
                                            type: 'text',
                                            label: b.styles,
                                            requiredContent: 'a{cke-xyz}',
                                            default: '',
                                            id: 'advStyles',
                                            validate: CKEDITOR.dialog.validate.inlineStyle(
                                                c.lang.common.invalidInlineStyle
                                            ),
                                            setup: g,
                                            commit: k,
                                        },
                                    ],
                                },
                                {
                                    type: 'hbox',
                                    widths: ['45%', '55%'],
                                    children: [
                                        {
                                            type: 'checkbox',
                                            id: 'download',
                                            requiredContent: 'a[download]',
                                            label: b.download,
                                            setup: function (a) {
                                                void 0 !== a.download && this.setValue('checked', 'checked');
                                            },
                                            commit: function (a) {
                                                this.getValue() && (a.download = this.getValue());
                                            },
                                        },
                                    ],
                                },
                            ],
                        },
                    ],
                },
            ],
            onShow: function () {
                var a = this.getParentEditor(),
                    b = a.getSelection(),
                    c = this.getContentElement('info', 'linkDisplayText').getElement().getParent().getParent(),
                    f = n.getSelectedLink(a, !0),
                    m = f[0] || null;
                m && m.hasAttribute('href') && (b.getSelectedElement() || b.isInTable() || b.selectElement(m));
                b = n.parseLinkAttributes(a, m);
                1 >= f.length && n.showDisplayTextForElement(m, a) ? c.show() : c.hide();
                this._.selectedElements = f;
                this.setupContent(b);
            },
            onOk: function () {
                var a = {};
                this.commitContent(a);
                if (this._.selectedElements.length) {
                    var b = this._.selectedElements,
                        h = n.getLinkAttributes(c, a),
                        f = [],
                        m,
                        l,
                        d,
                        g,
                        e,
                        k;
                    for (k = 0; k < b.length; k++) {
                        g = b[k];
                        l = g.data('cke-saved-href');
                        m = a.linkText && q != a.linkText;
                        d = l == q;
                        l = 'email' == a.type && l == 'mailto:' + q;
                        g.setAttributes(h.set);
                        g.removeAttributes(h.removed);
                        if (m) e = a.linkText;
                        else if (d || l) e = 'email' == a.type ? a.email.address : h.set['data-cke-saved-href'];
                        e && g.setText(e);
                        f.push(p(c, g));
                    }
                    c.getSelection().selectRanges(f);
                    delete this._.selectedElements;
                } else {
                    b = n.getLinkAttributes(c, a);
                    h = c.getSelection().getRanges();
                    f = new CKEDITOR.style({ element: 'a', attributes: b.set });
                    m = [];
                    f.type = CKEDITOR.STYLE_INLINE;
                    for (g = 0; g < h.length; g++) {
                        d = h[g];
                        d.collapsed
                            ? ((e = new CKEDITOR.dom.text(
                                  a.linkText || ('email' == a.type ? a.email.address : b.set['data-cke-saved-href']),
                                  c.document
                              )),
                              d.insertNode(e),
                              d.selectNodeContents(e))
                            : q !== a.linkText &&
                              ((e = new CKEDITOR.dom.text(a.linkText, c.document)),
                              d.shrink(CKEDITOR.SHRINK_TEXT),
                              c.editable().extractHtmlFromRange(d),
                              d.insertNode(e));
                        e = d._find('a');
                        for (k = 0; k < e.length; k++) e[k].remove(!0);
                        f.applyToRange(d, c);
                        m.push(d);
                    }
                    c.getSelection().selectRanges(m);
                }
            },
            onLoad: function () {
                c.config.linkShowAdvancedTab || this.hidePage('advanced');
                c.config.linkShowTargetTab || this.hidePage('target');
            },
            onFocus: function () {
                var a = this.getContentElement('info', 'linkType');
                a && 'url' == a.getValue() && ((a = this.getContentElement('info', 'url')), a.select());
            },
        };
    });
})();
